package lucava.util;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

/**
 * Écrit les fichiers correspondants à des FileBuffer
 */
public class FileBufferWriter {

	/**
	 * Écrit le contenu d'un FileBuffer dans un ficher.
	 * 
	 * @param aFileBuffer
	 *            , FileBuffer dont le contenu est à écrire dans un fichier.
	 */
	public static void generateFileFor(FileBuffer aFileBuffer) {
		// Récupération du nom du fichier à générer.
		String fileName = aFileBuffer.getFileName();
		try {
			// Ouverture du fichier
			System.out.println("Ouverture du fichier '" + fileName + "'");
			FileWriter fileWriter = new FileWriter(new File(fileName));

			// Écriture dans le fichier
			writeFileBuffer(fileWriter, aFileBuffer);

			// Fermeture du fichier
			closeFileWriter(fileWriter, fileName);

		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(
					"Erreur lors de l'ouverture du fichier '" + fileName + "'");
		}
	}

	/**
	 * Écrit le contenu de chacun des FileBuffer.
	 * 
	 * @param aFileBufferList
	 *            , Liste des FileBuffer dont le contenu est à écrire dans des
	 *            fichiers.
	 */
	public static void generateFileFor(List<FileBuffer> aFileBufferList) {
		// Parcours de tous les FileBuffer
		Iterator<FileBuffer> fileBufferIt = aFileBufferList.iterator();
		while (fileBufferIt.hasNext()) {
			// Génération du fichier pour le FileBuffer courant.
			generateFileFor(fileBufferIt.next());
		}
	}

	/**
	 * Écrit dans le FileWriter le contenu d'un FileBuffer.
	 * 
	 * @param aFileWriter
	 *            , Flux d'écriture dans lequel écrire.
	 * @param aFileBuffer
	 *            , FileBuffer dont le contenu est à écrire dans le flux.
	 */
	protected static void writeFileBuffer(FileWriter aFileWriter,
			FileBuffer aFileBuffer) {
		System.out.println("Écriture dans le fichier...");

		// Ecriture sécurisée dans le fichier
		try {
			aFileWriter.append(aFileBuffer.getContent());
		} catch (IOException e) {
			e.printStackTrace();
			throw new RuntimeException(
					"Erreur lors de l'écriture dans le fichier '"
							+ aFileBuffer.getFileName() + "'");
		}
	}

	/**
	 * Ferme le flux d'écriture du FileWriter.
	 * 
	 * @param aFileWriter
	 *            , Flux d'écriture à fermer.
	 * @param aFileName
	 *            , Nom du fichier concerné (pour l'affichage console).
	 */
	protected static void closeFileWriter(FileWriter aFileWriter,
			String aFileName) {
		System.out.println("Fermeture du fichier '" + aFileName + "'");

		try {
			aFileWriter.close();
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(
					"Erreur lors de la fermeture du fichier '" + aFileName
							+ "'");
		}
	}

}
